home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / msfencode < prev    next >
Text File  |  2006-06-30  |  6KB  |  248 lines

  1. #!/usr/bin/perl
  2. ###############
  3.  
  4. ##
  5. #         Name: msfencode
  6. #       Author: H D Moore <hdm [at] metasploit.com>
  7. #      Version: $Revision: 1.23 $
  8. #  Description: Command line interface for encoding payloads
  9. #      License:
  10. #
  11. #      This file is part of the Metasploit Exploit Framework
  12. #      and is subject to the same licenses and copyrights as
  13. #      the rest of this package.
  14. #
  15. ##
  16.  
  17. require 5.6.0;
  18.  
  19. use strict;
  20.  
  21. use FindBin qw{$RealBin};
  22. use lib "$RealBin/lib";
  23. use Getopt::Std;
  24. use POSIX;
  25.  
  26. use Msf::TextUI;
  27. use Msf::ColPrint;
  28. use Pex;
  29. use Pex::Text;
  30.  
  31. no utf8;
  32. no locale;
  33.  
  34. Msf::UI::ActiveStateSucks();
  35. Msf::UI::BrokenUTF8();
  36.  
  37. my $ui = Msf::TextUI->new($RealBin);
  38.  
  39. my $FRAMEVERSION = $ui->Version;
  40. my $VERSION = '$Revision: 1.23 $';
  41.  
  42. my %opts = ();
  43. my %tenv = ();
  44.  
  45. getopts("i:a:o:t:b:e:s:lhvn:", \%opts);
  46. Usage()   if($opts{'h'});
  47. Version() if($opts{'v'});
  48.  
  49. # Parse the command line options and store them in the env
  50. while(my($key, $val) = split('\=', shift(@ARGV))) {
  51.     $ui->SetTempEnv($key, $val) if defined($val);
  52. }
  53.  
  54. #$ui->SetTempEnv('DebugLevel', 0);
  55.  
  56. my $payloadArch = ['x86'];
  57. my $payloadOS = ['linux'];
  58. my $badChars = '\x00';
  59. my $encodedPayload;
  60. my $finalEncoder;
  61. my $rawShell;
  62. my $maxSize = 0xfffffff;
  63.  
  64. my $encoders = { };
  65. my $encodersIndex = $ui->LoadEncoders;
  66.  
  67. foreach my $key (keys(%{$encodersIndex})) {
  68.     $encoders->{@{[split(/::/,$key)]}[-1]} = $encodersIndex->{$key};
  69. }
  70.  
  71. $ui->SetTempEnv('_Encoders', $encodersIndex);
  72.  
  73. foreach my $opt (@ARGV) {
  74.   $ui->SetTempEnv(split('=', $opt));
  75. }
  76.  
  77. if($opts{'n'}) {
  78.   my $encoder = $opts{'n'};
  79.   Fatal('Invalid encoder specified') if(!exists($encoders->{$encoder}));
  80.   Info($encoders->{$encoder});
  81. }
  82.  
  83. if ($opts{'i'} && ! -r $opts{'i'}) {
  84.     Fatal('Invalid input file specified');
  85. }
  86.  
  87. if ($opts{'a'}) {
  88.     $payloadArch = [split(/,/, $opts{'a'})];
  89. }
  90.  
  91. if ($opts{'o'}) {
  92.     $payloadOS = [split(/,/, $opts{'o'})];
  93. }
  94.  
  95. if($opts{'t'} && $opts{'t'} !~ /perl|c|raw/) {
  96.     Fatal('Invalid output type specified');
  97. }
  98.  
  99. if ($opts{'b'} && $opts{'b'} !~ /\\x/) {
  100.     Fatal('Bad character list format is "\x00\x01\x02"');
  101. }
  102.  
  103. if ($opts{'e'} && ! exists($encoders->{$opts{'e'}})) {
  104.     Fatal('Invalid encoder specified');
  105. }
  106.  
  107. if ($opts{'l'}) {
  108.     ListEncoders();
  109. }
  110.  
  111. if ($opts{'s'}) {
  112.     $maxSize = $opts{'s'}+0;
  113. }
  114.  
  115. my $input  = $opts{'i'} || "-";
  116. open(X, "<$input") || Fatal('Could not access input file');
  117. $rawShell = join("", <X>);
  118. close(X);
  119.  
  120. if ($opts{'b'}) {
  121.     $badChars = $opts{'b'}; 
  122. }
  123.  
  124. $badChars =~ s/\\x([a-f0-9][a-f0-9])/chr(hex($1))/egi;  
  125.  
  126. my @encoderList = $ui->GetEncoders;
  127. if ($opts{'e'}) {
  128.     unshift @encoderList, 'Msf::Encoder::'.$opts{'e'};
  129. }
  130.  
  131. my $encoderName;
  132. foreach $encoderName (@encoderList) {
  133.     my $encoder = $ui->MakeEncoder($encoderName);
  134.     if(!$encoder) {
  135.       print STDERR "[*] Failed to make encoder $encoderName\n";
  136.       next;
  137.     }
  138.     
  139.     my $encoderArch = $encoder->Arch;
  140.     my $encoderOS = $encoder->OS;
  141.         
  142.     if(!$ui->ListCheck($payloadArch, $encoderArch)) {
  143.       print STDERR "[*] $encoderName failed, doesn't support all architectures\n";
  144.       next;
  145.     }
  146.  
  147.     if(!$ui->ListCheck($payloadOS, $encoderOS)) {
  148.       print STDERR "[*] $encoderName failed, doesn't support all operating systems\n";
  149.       next;
  150.     }
  151.  
  152.     my $encodedShell = $encoder->Encode($rawShell, $badChars);
  153.  
  154.     if(!$encodedShell) {
  155.       print STDERR "[*] $encoderName failed to return an encoded payload\n";
  156.       next;
  157.     }
  158.  
  159.     if($encoder->IsError) {
  160.       print STDERR "$encoderName failed with an error: ".$encoder->GetError."\n";
  161.       $encoder->ClearError;
  162.       next;
  163.     }
  164.  
  165.     if(Pex::Text::BadCharCheck($badChars, $encodedShell)) {
  166.       print STDERR "[*] $encoderName failed, bad chars in encoded payload\n";
  167.       next;
  168.     }
  169.  
  170.     $encodedPayload = Msf::EncodedPayload->new($rawShell, $encodedShell);
  171.     
  172.     if (length($encodedPayload->Payload) > $maxSize) {
  173.         print STDERR "[*] $encoderName failed, encoded payload too large (".length($encodedPayload->Payload)." bytes)\n";
  174.         undef($encodedPayload);
  175.         next;
  176.     }
  177.     
  178.     $finalEncoder = $encoderName;
  179.     last;
  180. }
  181.  
  182. if(!$encodedPayload) {
  183.     print STDERR "[*] No encoders succeeded :(\n";
  184.     exit(0);
  185. }
  186.  
  187. print STDERR "[*] Using $finalEncoder with final size of ".length($encodedPayload->Payload)." bytes\n";
  188.  
  189. if (! $opts{'t'} || $opts{'t'} =~ /perl/i) {
  190.     print Pex::Text::BufferPerl($encodedPayload->Payload);
  191. } elsif ($opts{'t'} =~ /c/) {
  192.     print Pex::Text::BufferC($encodedPayload->Payload);
  193. } else {
  194.     print $encodedPayload->Payload;
  195. }
  196.  
  197. sub Fatal {
  198.     my $msg = shift;
  199.     print STDERR "[*] $msg\n";
  200.     exit(0);
  201. }
  202.  
  203. sub Info {
  204.   my $encoder = shift;
  205.   print "\n" . $ui->DumpEncoderSummary($encoder);
  206.   exit(0);
  207. }
  208.  
  209. sub Usage {
  210.     print STDERR qq{
  211.   Usage: $0 <options> [var=val]
  212. Options:
  213.          -i <file>      Specify the file that contains the raw shellcode
  214.          -a <arch>      The target CPU architecture for the payload
  215.          -o <os>        The target operating system for the payload
  216.          -t <type>      The output type: perl, c, or raw
  217.          -b <chars>     The characters to avoid: '\\x00\\xFF'
  218.          -s <size>      Maximum size of the encoded data
  219.          -e <encoder>   Try to use this encoder first
  220.          -n <encoder>   Dump Encoder Information
  221.          -l             List all available encoders
  222.          
  223. };
  224.     exit(0);
  225. }
  226. sub Version {
  227.     my $ver = Pex::Utils::Rev2Ver($VERSION);
  228.     print STDERR qq{
  229.    Framework Version:  $FRAMEVERSION
  230.    Msfencode Version:  $ver
  231.  
  232. };
  233.   exit(0);
  234. }
  235.  
  236. sub ListEncoders {
  237.     my $col = Msf::ColPrint->new(2, 4);
  238.     $col->AddRow('Encoder Name', 'Arch', 'Description');
  239.     $col->AddHr('=');
  240.     foreach my $name (sort(keys(%{$encoders})))
  241.     {
  242.         my $encoder = $encoders->{$name};
  243.         $col->AddRow($name, join(', ',@{$encoder->Arch}), $encoder->Description);
  244.     }
  245.     print "\n" . $col->GetOutput . "\n";
  246.     exit(0);
  247. }
  248.